
// 1. 原型链继承
// 优点：所有实例共享原型上的方法
// 缺点：（1）无法像父类构造函数传参。（2）若有引用类型的属性时，修改某个实例的属性，其他实例的属性都会被修改。

function Parent(){
    this.name = 'parentname';
    this.actions = ['sleep','cook']; // 引用类型属性
}
// 在父原型链上设置方法
Parent.prototype.work = function(){
    console.log('parent work');
}
function Child(){
}

// parent的实例同时包含Parent的实例属性和原型属性方法，所以将new Parent()赋值给Child.prototype
Child.prototype = new Parent();
// 因为constructor属性包含在prototype中，我们改变了Child.prototype,可能会导致Child的实例判断出错，所以我们将Child赋值给Child.prototype.constructor
Child.prototype.constructor = Child;

Child.prototype.eat = function(){
    console.log('child eat')
}

var child1 = new Child();
var child2 = new Child();
child1.work(); // parent work
child1.eat(); // child eat 
console.log(child1 instanceof Parent); // true
console.log(child1 instanceof Child); //  true
console.log(child1.name); // parentname
child1.name = '我是child';
console.log(child1.name);  // 我是child
console.log(child2.name);  // parentname


console.log(child1.actions);  // [ 'sleep', 'cook' ]
console.log(child2.actions);  // [ 'sleep', 'cook' ]

child1.actions.push('dance'); // 修改实例child1的引用类型属性，导致其他实例的该属性也被修改

console.log(child1.actions);  // [ 'sleep', 'cook', 'dance' ]
console.log(child2.actions);  // [ 'sleep', 'cook', 'dance' ]

console.log(child1.name === child2.name); // false
console.log(child1.actions === child2.actions); // true
console.log(child1.work === child2.work); // true
console.log(child1.eat === child2.eat); // true
